#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

int main()
{
    //初始化：定义的同时，给值
    int num=0;

    //赋  值：先定义，再给值
    int val;
    val=0;

    //对于指针变量：需要使用地址（内存编号)给值
    //1.用对应类型的变量的地址
    int* p_1=&num;
    int* p_2;
    p_2=&val;


    //2.用相同类型的指针,p_1必须有值，已经初始化
    int* p_3=p_1;


    //3.直接使用地址
    //int* p_6=123456; //不对，类型不一致
    int* p_7=(int*)123456; //对的，类型强转了

    int a=10;
    printf("a 转十六进制： %0X\n", a);
    printf("a 转十六进制地址： %0X\n", &a);
    printf("a 地址： %p\n", &a);
    int* p_8=(int*)0X22FE0C; //将a地址放到这里
    printf("p_8存储的内容： %p\n", p_8);
    printf("*p_8存储的内容： %p\n", *p_8);


    //4.直接地址：置空：使用的0地址  
    //为了给暂无指向的指针，提供指向，保证安全，将内存中的0地址特殊化  
    //NULl:0X0 
    int* p_9=NULL;
    int* p_10=(int*)0X0;
    
    //5.用数组名：数组名就是数组的首地址
    /*
    数组名称保存的就是数组占用内存最小的那个地址
    既然数组名称保存就是地址,而指针也是用于保存地址,所以指针也可以指向数据
    int ages[3] = {1, 3, 5};
    int *p = &ages;   // p = ages = &ages;
    结论:如果利用指针保存数组的地址之后,那么p = ages = &ages;
    */

    int arr[3]={1,2,3};
    //数组类型：int[3]
    //元素类型：int
    //arr 类型：int*

    int* p_11=arr;
    int (*p_12)[3]=&arr;  //这才是正确的写法
    printf("arr=： %p\n", arr);
    printf("&arr=： %p\n", &arr);
    printf("P_11=： %p\n", p_11);
    printf("P_12=： %p\n", p_12);

    //字符串的本质就是数组,所以指针也可以指向字符串
    char str[]="abcdef";
    char* p_str=str;

    //6. 以及其他合法类型
	//system("pause");
	return 0;
} 